<?php

/**
 * Pages_PageController
 * 
 * Контроллер страниц сайта
 * 
 * @package   Basic
 * @author    Игорь Будасов aka Lord <igor.budasov@gmail.com> 
 * @copyright Игорь Будасов aka Lord <igor.budasov@gmail.com> 
 */
 
class Pages_PageController extends Lord_Controller_Action 
{  
	
/*------------------------------------------------------------------------------*/

	/**
	 * Отображает главную страницу
	 */
	 
	public function indexAction() 
	{   
		// получаем страницу
		$page = $this->model->getPage($this->_getParam('url'));
		     
		// отправляем ее в шаблон
		$this->view->page = $page;	
		 
		return;
	}
	
/*------------------------------------------------------------------------------*/
	
	/**
	 * Добавление новой страницы
	 */
	 
	public function addAction()
	{
		return $this->_process('add');
	}    
	
/*------------------------------------------------------------------------------*/
		 
	/**
	* Редактирование страницы
	*/
	
	public function editAction()
	{   
		// получаем данные
		$data = $this->model->fetchRow('id=' . $this->_checkId());
		
		// если в $data пусто - нам пытаются скормить что-то не то
		if(empty($data))
			return $this->view->assign('err', 'pages_page_edit_fail');
			
		// и отдаем на редактирование
		return $this->_process('edit', $data);
	}
		
/*------------------------------------------------------------------------------*/
         
    /**
    * страницы для меню
    */
    
    public function menuAction()
    {   
        // получаем данные для меню и отправляем в шаблон        
        $this->view->pages = $this->model->getMenu();

        return;
    }
        
/*------------------------------------------------------------------------------*/
		 
	/**
	* страницы для списка страниц
	*/
	
	public function listAction()
	{   
		// получаем данные для меню и отправляем в шаблон		
		$this->view->pages = $this->model->getMenu();
             
		return;
	}
		
/*------------------------------------------------------------------------------*/
 
	/**
	* удаление страницы
	*/
	
	function deleteAction()
	{
		// проверяем айдишник
		$id = $this->_checkId();
		// отправляем данные о странице в шаблон
		$this->view->page = $this->model->fetchRow('id=' . $id);
		
		if ($this->_request->isPost()) 
		{   // если юзер подтвердил - удаляем
			if ($this->_request->getPost('conf') == 'ok') 
			{
				$this->model->delete('id = ' . $id);
			}
		} 
		else 
		{
			// если в $this->view->page пусто - нам пытаются скормить левый $id
			if(empty($this->view->page))
				return $this->view->assign('err', 'pages_page_delete_fail');
			else
				return;
		}
		
		// возвращаемся на главную страницу
		$this->_redirect('');
	}
	
 /*==============================================================================*/

	/**
	* Приватный метод для обработки 
	* добавления и редактирования страницы
	* 
	* @param string $action
	* @param array $data
	* @return void
	*/

	private function _process($action = 'add', $data = array())
	{
		// показываем форму
		$form = $this->_form($data, array(), $action);
		$this->view->assign('form', $form); 
		
		// валидация
		if (!empty($_POST)) 
		{
			if (!$form->isValid($_POST)) 
			{   
				// показываем сообщение об ошибке
				$this->view->assign('err', 'form_fail');
				// получаем невалидные значения, введенные в форму         
				$values = $form->getUnfilteredValues();
				// получаем ошибки
				$errors = $form->getErrors(); 
				// показываем форму с невалидными данными
				return $this->view->assign('form', $this->_form($values, $errors, $action));
			}
		}
		
		/**
		* обрабатываем форму
		*/
		// если к нам что-то пришло из поста
		if ($this->_request->isPost()) 
		{    
			// получаем корректные данные, введенные юзером
			$values = $form->getValues();
			
			// кладем в базу и на главную страницу модуля
			// или показываем сообщение о завершении процесса  
			if($action == 'add')
			{
				// выбираем нужные данные для добавления
				$pageData['title']           = $values['title'];
				$pageData['content']         = $values['ckeditor1'];
				$pageData['url']             = $values['url'];
				$pageData['seo_description'] = $values['seo_description'];
				$pageData['seo_keywords']    = $values['seo_keywords'];
				$pageData['active']          = $values['active'];
				$pageData['order']           = $values['order'];
				$pageData['in_menu']         = $values['in_menu'];
			
				$this->model->insert($pageData);
				//$this->_redirect($this->_moduleName);
				return $this->view->assign('msg', 'pages_page_process_add_ok');                
			}
			elseif($action == 'edit')
			{
				// условие обновления
				$where = 'id = ' . $data['id'];
				
				// выбираем нужные данные для редактирования
				$pageData['title']           = $values['title'];
				$pageData['content']         = $values['ckeditor1'];
				$pageData['url']             = $values['url'];
				$pageData['seo_description'] = $values['seo_description'];
				$pageData['seo_keywords']    = $values['seo_keywords'];
				$pageData['active']          = $values['active'];
				$pageData['order']           = $values['order'];
				$pageData['in_menu']         = $values['in_menu'];
				
				$this->model->update($pageData, $where);
				//$this->_redirect($this->_moduleName);
				return $this->view->assign('msg', 'pages_page_process_edit_ok');
			}
		}        
	}
	
/*------------------------------------------------------------------------------*/

	/**
	* Приватный метод для проверки айдишника записи
	*/
	
	private function _checkId()
	{
		$id = $this->_getParam('id');
		
		if((int)$id == 0 
			or $id == false
			or $id == null
			or empty($id)
			or !isset($id))
		{
			return $this->_redirect($this->_moduleName);
		}
		else
		{
			return (int)$id;
		}
	}

/*------------------------------------------------------------------------------*/

	/**
	* Приватный метод для построения формы
	* Используется при добавлении и редактировании
	* В качестве аргумента принимает уже заполненые 
	* данные (при редактировании)
	* 
	* @param $data array 
	* @param $errors array
	* @param $action string
	* @return object
	*/
	
	private function _form($data = array(), $errors = array(), $action = 'add')
	{   
		// обратите внимание, форма создается на основе собственного класса. 
		$form = new Lord_Form_Form();
		$form->setAction( '/' . $this->_moduleName .
						  '/' . $this->_controllerName .
						  '/' . $action )
			 ->setMethod('post');
							 
		// кодировка	 
		$charset = $this->_helper->config()->common->charset;	

		// Заголовок страницы
		$title = new Lord_Form_Element_Text('title', array(
			'required'    => true,
			'label'       => $this->view->translate('pages_page_form_title'),
			'description' => $this->view->translate('pages_page_form_title_desc'),
			'maxlength'   => '50',
			'validators'  => array(
				array('Alnum',        true, array(true)),
				array('StringLength', true, array(0, 50, $charset))
			 ),
			'value'       => (!empty($data['title'])) ? $data['title'] : ''  
		));        
		$form->addElement($title);
		
		// Url страницы
		$url = new Zend_Form_Element_Text('url', array(
			'required'    => true,
			'label'       => $this->view->translate('pages_page_form_url'),
			'description' => $this->view->translate('pages_page_form_url_desc'),
			'maxlength'   => '30',
			'validators'  => array(
				array('Alnum',        true, array(true)),
				array('StringLength', true, array(0, 30, $charset))
			 ),
			'filters'     => array(
				array('StringToLower', true, array(true))
			),
			'value'       => (!empty($data['url'])) ? $data['url'] : '' 
		));
		if($action != 'edit')
		{  
			$url->addValidator(new Lord_Form_Validate_NoDbRecordExists('pages', 'url'));
		}
		$form->addElement($url);
		
		// SEO - Описание страницы
		$description = new Lord_Form_Element_SeoDescription('seo_description');
		$description->setValue((!empty($data['seo_description'])) 
									 ? $data['seo_description']
									 : '');
		$form->addElement($description);
		
		
		// SEO - Ключевые слова страницы
		$keywords = new Lord_Form_Element_SeoKeywords('seo_keywords');
		$keywords->setValue((!empty($data['seo_keywords'])) 
								  ? $data['seo_keywords']
								  : '');
		$form->addElement($keywords);
		
			 
		// Эдитор для контента
		// Для отображение редактора нужно поле ввода назвать ckeditor1 или ckeditor2
		// Эти имена можно изменить в /design/js/ckeditor/ckeditor_replace.js
		$content = new Zend_Form_Element_Textarea('ckeditor1', array(
			'label'       => $this->view->translate('pages_page_form_content'),
			'description' => $this->view->translate('pages_page_form_content_desc'),
			'rows'        => '15',
			'required'    => true, 
			'cols'        => '50',
			'validators'  => array(
				array('StringLength', true, array(0, 50000, $charset))
			 ),
			'filters'     => array('StringTrim'),
			'value'       => (isset($data['ckeditor1'])) 
									? $data['ckeditor1'] 
									: @$data['content']
		));
		$form->addElement($content);
		   
		// Акктивна ли страница 
		$active = new Zend_Form_Element_Radio('active', array(
			'label'       => $this->view->translate('pages_page_form_active'),
			'required'    => true, 
			'multiOptions'=> array('1' => $this->view->translate('pages_page_form_active_yes'), 
								   '2' => $this->view->translate('pages_page_form_active_no')),
			'description' => $this->view->translate('pages_page_form_active_desc'),
			'validators'  => array(array('InArray', true, array(array('1', '2'), true))),
			'value'       => (!empty($data['active'])) ? $data['active'] : 1 
		));               
		$active->setSeparator(' ');
		$form->addElement($active);
		
		
		// Показывать ли в меню 
		$inMenu = new Zend_Form_Element_Radio('in_menu', array(
			'label'       => $this->view->translate('pages_page_form_menu'),
			'required'    => true, 
			'multiOptions'=> array('1' => $this->view->translate('pages_page_form_menu_yes'),
								   '2' => $this->view->translate('pages_page_form_menu_no')),
			'validators'  => array(array('InArray', true, array(array('1', '2'), true))),
			'value'       => (!empty($data['in_menu'])) ? $data['in_menu'] : 1 
		));               
		$inMenu->setSeparator(' ');
		$form->addElement($inMenu);
		
		// Приоритет в меню  
        $order = new Zend_Form_Element_Select('order', array(
            'label'       => $this->view->translate('pages_page_form_order'),
            'multiOptions'=> array(1=>1, 2=>2, 3=>3, 4=>4, 5=>5, 6=>6, 7=>7, 8=>8, 9=>9),
            'required'    => true, 
            'filters'     => array('Int'),
            'description' => $this->view->translate('pages_page_form_order_desc'),
            'value'       => (!empty($data['order'])) ? $data['order'] : ''
        ));
        $form->addElement($order); 
	  
		// Айдишник 
		$id = $form->createElement('hidden', 'id')
			 ->setValue(($action == 'edit') ? $this->_checkId() : 0);
		$form->addElement($id);

		// Кнопка сабмита
		$form->addElement('submit', 'save', array('label' => $this->view->translate('pages_page_form_submit')));
			
		// ошибки
		$this->_helper->FormErrors($errors, $form);
		
		return $form;
	}

/*------------------------------------------------------------------------------*/

}